package it.clem.little.domain.terreno;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Terreno {
  private final Set<IUnitaSchierata> elencoUnita = new HashSet<IUnitaSchierata>();
  public final int hpMioCastelloIniziali;
  public final int hpCastelloAvversarioIniziali;
  public int hpMioCastelloCorrenti;
  public int hpCastelloAvversarioCorrenti;

  public Terreno(int hpMioCastelloIniziali, int hpCastelloAvversarioIniziali) {
    super();
    this.hpMioCastelloIniziali = hpMioCastelloIniziali;
    this.hpCastelloAvversarioIniziali = hpCastelloAvversarioIniziali;
    this.hpMioCastelloCorrenti = hpMioCastelloIniziali;
    this.hpCastelloAvversarioCorrenti = hpCastelloAvversarioIniziali;
  }

  public void addUnita(IUnitaSchierata unita) {
    elencoUnita.add(unita);
  }

  public Set<IUnitaSchierata> getElencoUnita() {
    return elencoUnita;
  }

  public boolean terminato() {
    return !vittoria() && !sconfitta();
  }

  public boolean vittoria() {
    return hpCastelloAvversarioCorrenti <= 0 || findTruppeNemiche().size() == 0;
  }

  public boolean sconfitta() {
    return hpMioCastelloCorrenti <= 0 || findMieTruppe().size() == 0;
  }

  public void rimuoviCaduti() {
    Iterator<IUnitaSchierata> it = elencoUnita.iterator();
    while (it.hasNext()) {
      if (it.next().isDead())
        it.remove();
    }
  }

  public Set<IUnitaSchierata> findMieTruppe() {
    Set<IUnitaSchierata> res = new HashSet<IUnitaSchierata>();
    for (IUnitaSchierata unit : elencoUnita) {
      if (unit.isAmica() && !unit.isDead())
        res.add(unit);
    }
    return res;
  }

  public Set<IUnitaSchierata> findTruppeNemiche() {
    Set<IUnitaSchierata> res = new HashSet<IUnitaSchierata>();
    for (IUnitaSchierata unit : elencoUnita) {
      if (!unit.isAmica() && !unit.isDead())
        res.add(unit);
    }
    return res;
  }

  public int getHpMioCastelloIniziali() {
    return hpMioCastelloIniziali;
  }

  public int getHpCastelloAvversarioIniziali() {
    return hpCastelloAvversarioIniziali;
  }

  public int getHpMioCastelloCorrenti() {
    return hpMioCastelloCorrenti;
  }

  public int getHpCastelloAvversarioCorrenti() {
    return hpCastelloAvversarioCorrenti;
  }

  public void sottraiHPMioCastello(int hp) {
    hpMioCastelloCorrenti = Math.max(hpMioCastelloCorrenti - hp, 0);
  }

  public void sottraiHPCastelloAvversario(int hp) {
    hpCastelloAvversarioCorrenti = Math.max(hpCastelloAvversarioCorrenti - hp, 0);
  }

}
